package sv.gob.mh.dgii.model;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.springframework.format.annotation.DateTimeFormat;

@Entity
@Table(name = "QD_CASO", schema = "DEFCONTRIB")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "TIPO_CASO", discriminatorType = DiscriminatorType.STRING)
@SequenceGenerator(name = "SEQ_QD_CASO", sequenceName = "SEQ_QD_CASO")

public class QdCaso implements Serializable {
	private static final long serialVersionUID = 1L;
		private Long idCaso;
        
		private String codigo;
		private Date ingreso;
		private String usuarioReceptor;
		private String medioInterposicion;
		private String estado;
		private Integer tiempoAsignado;
		private Date finCompromiso;
		private Long idTecnicoReceptor;
		private TbTecnico tecnicoReceptor;
		private Long idTecnicoContable;
		private TbTecnico tecnicoContable;
		private Date asignacionContable;
		private Long idTecnicoJuridico;
		private TbTecnico tecnicoJuridico;
		private Date asignacionJuridico;
		private Integer tiempoAplicado;
		private Date cierre;
		private String resultado;
		protected String tipoCaso;
		protected String nombreCaso;

		protected String competencia;

   public QdCaso() {
       
   }             
   
   public QdCaso(Long idCaso){
       this.idCaso = idCaso;
   }
            
   public QdCaso(Long idCaso, Date ingreso, String usuarioReceptor, String medioInterposicion, String estado){
       this.idCaso = idCaso;
       this.ingreso = ingreso;
       this.usuarioReceptor = usuarioReceptor;
       this.medioInterposicion = medioInterposicion;
       this.estado = estado;
   }
                
    @Id
    @Column(name = "ID_CASO")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_QD_CASO")
	public Long getIdCaso() {
		return idCaso;
	}

	public void setIdCaso(Long idCaso) {
		this.idCaso = idCaso;
	}

    @Column(name = "CODIGO", updatable = false)
	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

        @Temporal(TemporalType.TIMESTAMP)
	@Column(name = "INGRESO", unique = false, length = 7)
	public Date getIngreso() {
		return this.ingreso;
	}

	public void setIngreso(Date ingreso) { 
		this.ingreso = ingreso;
	}

        @Column(name = "USUARIO_RECEPTOR", unique = false, nullable = false, insertable = true, updatable = true, length = 30)
	public String getUsuarioReceptor() {
		return this.usuarioReceptor;
	}

	public void setUsuarioReceptor(String usuarioReceptor) {
		this.usuarioReceptor = usuarioReceptor;
	}

    	@Column(name = "MEDIO_INTERPOSICION", unique = false, nullable = false, insertable = true, updatable = true, length = 3)
	public String getMedioInterposicion() {
		return this.medioInterposicion;
	}

	public void setMedioInterposicion(String medioInterposicion) {
		this.medioInterposicion = medioInterposicion;
	}

	@Column(name = "ESTADO", unique = false, nullable = false, insertable = true, updatable = true, length = 3)
	public String getEstado() {
		return this.estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

        @Column(name = "TIEMPO_ASIGNADO", unique = false, nullable = true, insertable = true, updatable = true)
	public Integer getTiempoAsignado() {
		return tiempoAsignado;
	}

	public void setTiempoAsignado(Integer tiempoAsignado) {
		this.tiempoAsignado = tiempoAsignado;
	}

        @Temporal(TemporalType.DATE)
	@Column(name = "FIN_COMPROMISO", unique = false, nullable = true, insertable = true, updatable = true, length = 7)
	//@NotNull
	@DateTimeFormat(pattern="dd/MM/yyyy")
	public Date getFinCompromiso() {
		return this.finCompromiso;
	}

	public void setFinCompromiso(Date finCompromiso) {
		this.finCompromiso = finCompromiso;
	}

        @Column(name = "ID_TECNICO_CONTABLE", nullable = true)
	public Long getIdTecnicoContable() {
		return idTecnicoContable;
	}

	public void setIdTecnicoContable(Long idTecnicoContable) {
		this.idTecnicoContable = idTecnicoContable;
	}

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "ID_TECNICO_CONTABLE", nullable = true, insertable = false, updatable = false)
	public TbTecnico getTecnicoContable() {
		return tecnicoContable;
	}

	public void setTecnicoContable(TbTecnico tecnicoContable) {
		this.tecnicoContable = tecnicoContable;
	}

    @Column(name = "ID_TECNICO_JURIDICO", nullable = true)
	public Long getIdTecnicoJuridico() {
		return idTecnicoJuridico;
	}

	public void setIdTecnicoJuridico(Long idTecnicoJuridico) {
		this.idTecnicoJuridico = idTecnicoJuridico;
	}

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_TECNICO_JURIDICO", nullable = true, insertable = false, updatable = false)
	public TbTecnico getTecnicoJuridico() {
		return tecnicoJuridico;
	}

	public void setTecnicoJuridico(TbTecnico tecnicoJuridico) {
		this.tecnicoJuridico = tecnicoJuridico;
	}

    @Column(name = "TIEMPO_APLICADO", insertable = true, updatable = true )
	public Integer getTiempoAplicado() {
		return tiempoAplicado;
	}

	public void setTiempoAplicado(Integer tiempoAplicado) {
		this.tiempoAplicado = tiempoAplicado;
	}

        
	@Temporal(TemporalType.DATE)
	@Column(name = "CIERRE", unique = false, nullable = true, insertable = true, updatable = true, length = 7)
	//@NotNull
	@DateTimeFormat(pattern="dd/MM/yyyy")
	public Date getCierre() {
		return cierre;
	}

	public void setCierre(Date cierre) {
		this.cierre = cierre;
	}

    @Column(name = "RESULTADO" , nullable = true, insertable = true, updatable = true )
	public String getResultado() {
		return resultado;
	}

	public void setResultado(String resultado) {
		this.resultado = resultado;
	}

    @Column(name = "TIPO_CASO")
	public String getTipoCaso() {
		return tipoCaso;
	}

	public void setTipoCaso(String tipoCaso) {
		this.tipoCaso = tipoCaso;
	}

    @Column(name = "NOMBRE_CASO")
	public String getNombreCaso() {
		return nombreCaso;
	}

	public void setNombreCaso(String nombreCaso) {
		this.nombreCaso = nombreCaso;
	}

    @Column(name = "ID_TECNICO_RECEPTOR", nullable = true, updatable = false)
	public Long getIdTecnicoReceptor() {
		return idTecnicoReceptor;
	}

	public void setIdTecnicoReceptor(Long idTecnicoReceptor) {
		this.idTecnicoReceptor = idTecnicoReceptor;
	}

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_TECNICO_RECEPTOR", nullable = true, insertable = false, updatable = false)
	public TbTecnico getTecnicoReceptor() {
		return tecnicoReceptor;
	}

	public void setTecnicoReceptor(TbTecnico tecnicoReceptor) {
		this.tecnicoReceptor = tecnicoReceptor;
	}

	//@Temporal(TemporalType.DATE)
        @Temporal(TemporalType.TIMESTAMP)
	@Column(name = "ASIGNACION_CONTABLE", unique = false, nullable = true, insertable = true, updatable = true, length = 7)
	//@NotNull
	//@DateTimeFormat(pattern="dd/MM/yyyy")
	public Date getAsignacionContable() {
		return asignacionContable;
	}

	public void setAsignacionContable(Date asignacionContable) {
		this.asignacionContable = asignacionContable;
	}

	//@Temporal(TemporalType.DATE)
        @Temporal(TemporalType.TIMESTAMP)
	@Column(name = "ASIGNACION_JURIDICO", unique = false, nullable = true, insertable = true, updatable = true, length = 7)
	//@NotNull
	//@DateTimeFormat(pattern="dd/MM/yyyy")
	public Date getAsignacionJuridico() {
		return asignacionJuridico;
	}

	public void setAsignacionJuridico(Date asignacionJuridico) {
		this.asignacionJuridico = asignacionJuridico;
	}

        @Column(name = "COMPETENCIA" , unique = false, nullable = false, insertable = true, updatable = true, length = 1)
	public String getCompetencia() {
		return competencia;
	}

	public void setCompetencia(String competencia) {
		this.competencia = competencia;
	}

}